
//用来封装单个俄罗斯方块的信息和控制逻辑

import BlockUtil from "./BlockUtil.js"

//一个俄罗斯方块是由4行4列的小方块构成
export const ROWS = 4,COLS = 4

//10种不同类型的俄罗斯方块
//每个俄罗斯方块信息使用一个4*4的二维数据记录，其中有小方块的位置为1，否则为0（空方块）
//这是一个三维数组，第一维度的每个元素对应一种类型的俄罗斯方块数据
export const TETRIS_TYPE = [
    [
        [0,1,1,0],
        [0,0,1,0],
        [0,0,1,0],
        [0,0,0,0]
    ],[
        [0,1,1,0],
        [0,1,0,0],
        [0,1,0,0],
        [0,0,0,0]
    ],[
        [0,1,0,0],
        [0,1,1,0],
        [0,0,1,0],
        [0,0,0,0]
    ],[
        [0,0,1,0],
        [0,1,1,0],
        [0,1,0,0],
        [0,0,0,0]
    ],[
        [0,0,0,0],
        [0,1,1,0],
        [0,1,1,0],
        [0,0,0,0]
    ],[
        [0,0,1,0],
        [0,1,1,0],
        [0,0,1,0],
        [0,0,0,0]
    ],[
        [0,0,1,0],
        [0,0,1,0],
        [0,0,1,0],
        [0,0,1,0]
    ],[
        [0,1,1,1],//8
        [0,1,0,1],
        [0,0,0,0],
        [0,0,0,0]
    ],[
        [0,0,1,0],//9
        [0,1,1,0],
        [0,0,0,0],
        [0,0,0,0]
    ],[
        [0,0,1,0],//10
        [0,0,1,0],
        [0,1,1,0],
        [0,0,0,0]
    ]
]

export default class Tetris{
    //现在所处的位置，对应俄罗斯方块左上角
    position = {row:0,col:0}
    blocks = null

    //构造俄罗斯方块需要传入它的类型type，初始时的旋转角度，初始位置
    constructor(type,rotate = 0,position){
        //根据传入参数type的值初始化俄罗斯方块对象的blocks属性
        //将当前这个俄罗斯方块由哪些小方块构成记录下来
        //需要注意的是，不能把常量数组TETRIS_TYPE里面的元素直接赋值给俄罗斯方块对象的blocks属性
        //否则，当这个俄罗斯方块的blocks属性变化时，也会影响TETRIS_TYPE数组里面的值
        //所以得在进行blocks数组初始化时拷贝一个副本
        //将拷贝的副本赋值给blocks属性
        //对于传入的每一个0/1都乘以type值+1
        //这样复制到的二维数组里的1就会被替换成type+1，可以表达方块的颜色
        this.blocks = BlockUtil.deepCopy(TETRIS_TYPE[type],block => block*(type + 1))
    }

    move(offsetRow,offsetCol){
        //直接更新position属性的值
        this.position.row += offsetRow
        this.position.col += offsetCol
    }

    //旋转一个区域的小方块，将具体的实现逻辑写到BlockUtil模块里
    rotate(rotate){
        //调用BlockUtil模块中的rotate（）函数来完成当前俄罗斯方块的旋转
        BlockUtil.rotate(this.blocks,rotate)
    }
}